package cn.xuchunh.guava.base;

import java.util.ArrayList;
import java.util.List;

import static com.google.common.base.Preconditions.*;

/**
 * Created by XCH on 2017/3/29.
 * <p>
 * <a href='http://wiki.jikexueyuan.com/project/google-guava-official-tutorial/precondition.html'>前置条件</a>
 * <ul>
 * <li>没有额外参数：抛出的异常中没有错误消息;</li>
 * <li>有一个 Object 对象作为额外参数：抛出的异常使用 Object.toString() 作为错误消息；</li>
 * <li>有一个 String 对象作为额外参数，并且有一组任意数量的附加 Object 对象.
 *     这个变种处理异常消息的方式有点类似 printf，但考虑 GWT 的兼容性和效率，只支持%s 指示符</li>
 * </ul>
 *
 * @author XCH
 * @version 1.0.0-SNAPSHOT
 */
public class PreconditionTaste {

    public static void main(String[] args) {

        int i = -1;
        int j = -2;

        // 没有额外参数：抛出的异常中没有错误消息;
        try {
            // IllegalArgumentException
            checkArgument(i >= 0);
        } catch (Exception e) {
            System.out.println(e);
        }

        // 有一个 Object 对象作为额外参数：抛出的异常使用 Object.toString() 作为错误消息；
        try {
            checkArgument(i >= 0, i);
        } catch (Exception e) {
            System.out.println(e);
        }

        // 有一个 String 对象作为额外参数，并且有一组任意数量的附加 Object 对象.
        // 这个变种处理异常消息的方式有点类似 printf，但考虑 GWT 的兼容性和效率，只支持%s 指示符
        try {
            checkArgument(i >= 0, "argument was %s but expected nonnegative", i);
        } catch (Exception e) {
            System.out.println(e);
        }
        try {
            checkArgument(i < j, "Expected i < j, but %s > %s", i, j);
        } catch (Exception e) {
            System.out.println(e);
        }

        String s = "not null";
        try {
            // NullPointerException
            // 检查 value 是否为 null，该方法直接返回 value，因此可以内嵌使用 checkNotNull。
            System.out.println(checkNotNull(s));
            s = null;
            checkNotNull(s);
        } catch (Exception e) {
            System.out.println(e);
        }

        try {
            // IllegalStateException
            // 用来检查对象的某些状态
            checkState(i < j);
        } catch (Exception e) {
            System.out.println(e);
        }

        List<String> list = new ArrayList<>(15);
        for (int k = 0; k < 15; k++) {
            list.add(k + "");
        }
        try {
            // IndexOutOfBoundsException
            // 检查 index 作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size
            System.out.println(checkElementIndex(0, list.size()));
            checkElementIndex(15, list.size());
        } catch (Exception e) {
            System.out.println(e);
        }

        try {
            // IndexOutOfBoundsException
            // 检查 index 作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size
            System.out.println(checkPositionIndex(15, list.size()));
            checkPositionIndex(16, list.size());
        } catch (Exception e) {
            System.out.println(e);
        }

        try {
            // IndexOutOfBoundsException
            // 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效
            checkPositionIndexes(0, 16, list.size());
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}
